/**
 * 递归：函数反复自身调用自己，直到最终结果，跳出或终止调用
 */
let n = 0
numPlus()
function numPlus() {
    n += 1
    if (n === 10000) {
        return
    }
    numPlus()
}

// 由于return时，使用了参数，那么函数就会一直在执行栈内
function factorial (n) {
    if(n === 1) {
        return 1
    }
    return n * factorial(n - 1)
}
factorial(5)


function factorial (n, total = 1) {
    if(n === 1) {
        return total
    }
    let result =  factorial(n - 1, n * total)
    console.log(result)
    return result
}
factorial(5)

// *****************************************
// 问题描述：1, 1, 2, 3, 5, 8, 13, 21, 34, ....... 求第n个数是多少。
let fib = function (n) {
    if (n <= 2) return 1
    return fib(n - 1) + fib(n - 2)
}
let number = fib(5)
console.log(number)

// *****************************************
// 1. 输出斐波那契数列的前10项 1、1、2、3、5、8、13、21、34......
// 2. 思考代码是否有大量重复的计算？应该如何解决重复计算的问题
// 3. 还有其他方式来实现吗？（数组）
function fib(n) {
    return n == 0 || n == 1 ? 1: fib(n - 1) + fib(n - 2)
}
for (let i = 0; i < 10; i++) {
    console.log(fib(i))
}
// 通过缓存来解决重复计算的问题
let cache = {}
function fib(n) {
    if (cache.hasOwnProperty(n)) {
        return cache[n]
    }
    let v = n == 0 || n == 1 ? 1: fib(n - 1) + fib(n - 2)
    cache[n] = v
    return v
}
for (let i = 0; i < 10; i++) {
    console.log(fib(i))
}

// 通过数组来实现
let arr = [1, 1]
while( arr.length < 10) {
    arr.push(arr[arr.length - 2] + arr[arr.length - 1])
}
console.log(arr)

// *****************************************
// 将高维数组[1, 2 [3, [4, 5], 6], 7, [8], 9]变为下列对象：
{
    children:[
        {value: 1},
        {value: 2},
        {
            children: [
                {value: 3},
                {
                    children: [
                        {value: 4},
                        {value: 5}
                    ]
                },
                {value: 6}
            ]
        },
        {value: 7},
        {
            children: [
                {value: 8}
            ]
        },
        {value: 9}
    ]
}

var arr11 = [1, 2, [3, [4, 5], 6], 7, [8], 9]
// 方法一：
function convertArr(arr) {
    var result = {
        children: []
    }
    for (let i = 0; i < arr.length; i++) {
        if (typeof arr[i] == 'number') {
            result.children.push({
                value: arr[i]
            })
        } else if (Array.isArray(arr[i])) {
            result.children.push({
                children: convertArr(arr[i])
            })
        }
    }
    return result
}
console.log(convertArr(arr11))


// 方法二：
var arr11 = [1, 2, [3, [4, 5], 6], 7, [8], 9]
function convertItem(item) {
    if (typeof item == 'number') {
        return {
            value: item
        }
    } else if (Array.isArray(item)) {
        return {
            children: item.map(_item => convertItem(_item))
        }
    }
}
console.log(convertItem(arr11))
